syleprovider: Add a vfunc to get the changes
authorBenjamin Otte <otte@redhat.com>
Sat, 17 Mar 2012 20:09:51 +0000 (21:09 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 17 Apr 2012 06:59:08 +0000 (08:59 +0200)
This way we can check what changes are even interesting for our matcher.

gtk/gtkcssprovider.c
gtk/gtkmodifierstyle.c
gtk/gtksettings.c
gtk/gtkstylecascade.c
gtk/gtkstyleproperties.c
gtk/gtkstyleproviderprivate.c
gtk/gtkstyleproviderprivate.h

index 93201007aacf88db97eb376b5ed8bd33ea623ead..022d408ebd4894320286855b8217397f2110c078 100644 (file)
@@ -1299,6 +1299,12 @@ gtk_css_ruleset_matches (GtkCssRuleset       *ruleset,
   return _gtk_css_selector_matches (ruleset->selector, matcher);
 }
 
+static GtkCssChange
+gtk_css_ruleset_get_change (GtkCssRuleset *ruleset)
+{
+  return _gtk_css_selector_get_change (ruleset->selector);
+}
+
 static void
 gtk_css_scanner_destroy (GtkCssScanner *scanner)
 {
@@ -1627,11 +1633,42 @@ gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider,
     }
 }
 
+static GtkCssChange
+gtk_css_style_provider_get_change (GtkStyleProviderPrivate *provider,
+                                   const GtkCssMatcher     *matcher)
+{
+  GtkCssProvider *css_provider;
+  GtkCssProviderPrivate *priv;
+  GtkCssChange change = 0;
+  int i;
+
+  css_provider = GTK_CSS_PROVIDER (provider);
+  priv = css_provider->priv;
+
+  for (i = priv->rulesets->len - 1; i >= 0; i--)
+    {
+      GtkCssRuleset *ruleset;
+
+      ruleset = &g_array_index (priv->rulesets, GtkCssRuleset, i);
+
+      if (ruleset->styles == NULL)
+        continue;
+
+      if (!gtk_css_ruleset_matches (ruleset, matcher))
+        continue;
+
+      change |= gtk_css_ruleset_get_change (ruleset);
+    }
+
+  return change;
+}
+
 static void
 gtk_css_style_provider_private_iface_init (GtkStyleProviderPrivateInterface *iface)
 {
   iface->get_color = gtk_css_style_provider_get_color;
   iface->lookup = gtk_css_style_provider_lookup;
+  iface->get_change = gtk_css_style_provider_get_change;
 }
 
 static void
index c16a051c445206a562645de8c0d822665c981fb3..2700250690bfc9e837b8d752b9b4e4bacaeec09f 100644 (file)
@@ -154,11 +154,22 @@ gtk_modifier_style_provider_lookup (GtkStyleProviderPrivate *provider,
                                       lookup);
 }
 
+static GtkCssChange
+gtk_modifier_style_provider_get_change (GtkStyleProviderPrivate *provider,
+                                        const GtkCssMatcher     *matcher)
+{
+  GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider);
+
+  return _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style),
+                                                 matcher);
+}
+
 static void
 gtk_modifier_style_provider_private_init (GtkStyleProviderPrivateInterface *iface)
 {
   iface->get_color = gtk_modifier_style_provider_get_color;
   iface->lookup = gtk_modifier_style_provider_lookup;
+  iface->get_change = gtk_modifier_style_provider_get_change;
 }
 
 static void
index 75487b8239d7ce60b233da8e2bff00db4885cd57..f1b03ee72b8ca0622fec989e4876377a4694f90a 100644 (file)
@@ -1481,11 +1481,24 @@ gtk_settings_style_provider_lookup (GtkStyleProviderPrivate *provider,
                                       lookup);
 }
 
+static GtkCssChange
+gtk_settings_style_provider_get_change (GtkStyleProviderPrivate *provider,
+                                        const GtkCssMatcher     *matcher)
+{
+  GtkSettings *settings = GTK_SETTINGS (provider);
+
+  settings_ensure_style (settings);
+
+  return _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (settings->priv->style),
+                                                 matcher);
+}
+
 static void
 gtk_settings_provider_private_init (GtkStyleProviderPrivateInterface *iface)
 {
   iface->get_color = gtk_settings_style_provider_get_color;
   iface->lookup = gtk_settings_style_provider_lookup;
+  iface->get_change = gtk_settings_style_provider_get_change;
 }
 
 static void
index f1bf5161258f35bede28d903ad19975a40b3dd35..a05d36dd77619f2abf927ada295bca88a809572a 100644 (file)
@@ -198,11 +198,39 @@ gtk_style_cascade_lookup (GtkStyleProviderPrivate *provider,
     }
 }
 
+static GtkCssChange
+gtk_style_cascade_get_change (GtkStyleProviderPrivate *provider,
+                              const GtkCssMatcher     *matcher)
+{
+  GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider);
+  GtkStyleCascadeIter iter;
+  GtkStyleProvider *item;
+  GtkCssChange change = 0;
+
+  for (item = gtk_style_cascade_iter_init (cascade, &iter);
+       item;
+       item = gtk_style_cascade_iter_next (cascade, &iter))
+    {
+      if (GTK_IS_STYLE_PROVIDER_PRIVATE (item))
+        {
+          change |= _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (item),
+                                                            matcher);
+        }
+      else
+        {
+          g_return_val_if_reached (GTK_CSS_CHANGE_ANY);
+        }
+    }
+
+  return change;
+}
+
 static void
 gtk_style_cascade_provider_private_iface_init (GtkStyleProviderPrivateInterface *iface)
 {
   iface->get_color = gtk_style_cascade_get_color;
   iface->lookup = gtk_style_cascade_lookup;
+  iface->get_change = gtk_style_cascade_get_change;
 }
 
 G_DEFINE_TYPE_EXTENDED (GtkStyleCascade, _gtk_style_cascade, G_TYPE_OBJECT, 0,
index 5add14dfc2328f136e8147fc5ad86468404d3791..d63b659dde80d5c25ca97b8176c072d8893950f0 100644 (file)
@@ -337,11 +337,19 @@ gtk_style_properties_provider_lookup (GtkStyleProviderPrivate *provider,
     }
 }
 
+static GtkCssChange
+gtk_style_properties_provider_get_change (GtkStyleProviderPrivate *provider,
+                                          const GtkCssMatcher     *matcher)
+{
+  return GTK_CSS_CHANGE_STATE;
+}
+
 static void
 gtk_style_properties_provider_private_init (GtkStyleProviderPrivateInterface *iface)
 {
   iface->get_color = gtk_style_properties_provider_get_color;
   iface->lookup = gtk_style_properties_provider_lookup;
+  iface->get_change = gtk_style_properties_provider_get_change;
 }
 
 /* GtkStyleProperties methods */
index 43ae1712ff4a23f55b39338c2e687979883a6a56..fc7e29862e25278eb9c709fbff9edfd8746c66d0 100644 (file)
@@ -61,3 +61,20 @@ _gtk_style_provider_private_lookup (GtkStyleProviderPrivate *provider,
 
   iface->lookup (provider, matcher, lookup);
 }
+
+GtkCssChange
+_gtk_style_provider_private_get_change (GtkStyleProviderPrivate *provider,
+                                        const GtkCssMatcher     *matcher)
+{
+  GtkStyleProviderPrivateInterface *iface;
+
+  g_return_val_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider), GTK_CSS_CHANGE_ANY);
+  g_return_val_if_fail (matcher != NULL, GTK_CSS_CHANGE_ANY);
+
+  iface = GTK_STYLE_PROVIDER_PRIVATE_GET_INTERFACE (provider);
+
+  if (!iface->get_change)
+    return GTK_CSS_CHANGE_ANY;
+
+  return iface->get_change (provider, matcher);
+}
index e0555026c6328d837cfbd7bf941c53da59ebb82d..88b64a03b3d57dd75b9914f5de34058943bbbcb7 100644 (file)
@@ -44,6 +44,8 @@ struct _GtkStyleProviderPrivateInterface
   void                  (* lookup)              (GtkStyleProviderPrivate *provider,
                                                  const GtkCssMatcher     *matcher,
                                                  GtkCssLookup            *lookup);
+  GtkCssChange          (* get_change)          (GtkStyleProviderPrivate *provider,
+                                                 const GtkCssMatcher     *matcher);
 };
 
 GType                   _gtk_style_provider_private_get_type     (void) G_GNUC_CONST;
@@ -53,6 +55,8 @@ GtkSymbolicColor *      _gtk_style_provider_private_get_color    (GtkStyleProvid
 void                    _gtk_style_provider_private_lookup       (GtkStyleProviderPrivate *provider,
                                                                   const GtkCssMatcher     *matcher,
                                                                   GtkCssLookup            *lookup);
+GtkCssChange            _gtk_style_provider_private_get_change   (GtkStyleProviderPrivate *provider,
+                                                                  const GtkCssMatcher     *matcher);
 
 G_END_DECLS